package com.example.wechat.service.impl;

import com.example.wechat.enums.PayStates;
import com.example.wechat.pojo.pay.Order;
import com.example.wechat.service.OrderServiceI;
import com.github.wxpay.sdk.WXPay;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Service
public class OrderServiceImpl implements OrderServiceI {
    @Autowired
    private WXPay wxPay;

    /**
     * 订单查询
     */
    @Override
    public PayStates queryOrder(Order order) {
        try {
            Map<String, String> data = new HashMap<String, String>();
            data.put("out_trade_no", order.getOrderNumber());
            Map<String, String> resp = wxPay.orderQuery(data);
            System.out.println(resp);
            /**
             * SUCCESS：支付成功
             * REFUND：转入退款
             * NOTPAY：未支付
             * CLOSED：已关闭
             * REVOKED：已撤销（仅付款码支付会返回）
             * USERPAYING：用户支付中（仅付款码支付会返回）
             * PAYERROR：支付失败（仅付款码支付会返回）
             */
            PayStates trade_state = PayStates.getPayStates(resp.get("trade_state"));
            //校验订单返回的状态是否正确
            if(!trade_state.isERROR()){
                //将订单状态进行变更
                order.setOrderState(trade_state);
            }else{
                throw new RuntimeException("微信返回的订单状态有错误");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return order.getOrderState();
    }
    /**
     * 统一下单
     * 返回订单链接
     */
    @Override
    public String createOrderByNativePay(Order order) {
        Map<String, String> data = new HashMap<String, String>();
        //微信官方文档是description，但实际代码所需要的body
        data.put("body", order.getDescription());
        //生成订单号
        order.setOrderNumber(generateOrderNumber("PS","0000000001"));
        data.put("out_trade_no", order.getOrderNumber());
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        String str=format.format(new Date(new Date().getTime() + 120000))+"+08:00";
        System.out.println(str);
        //不知道为什么过时有问题
//        data.put("time_expire",str);
        data.put("fee_type", "CNY");
        data.put("total_fee", String.valueOf(order.getCost()));
        data.put("spbill_create_ip", "127.0.0.1");
        //支付成功回调地址。
        data.put("notify_url", "https://www.baidu.com/");
        data.put("trade_type", "NATIVE");  // 此处指定为扫码支付
        data.put("product_id", order.getProductId());
        String code_url=null;
        try {
            while(true){
                Map<String, String> resp = wxPay.unifiedOrder(data);
                System.out.println(resp);
                code_url=resp.get("code_url");
                //订单号重复
                if(resp.get("err_code_des")!=null&& resp.get("err_code_des").contains("201")){
                    //订单号重复处理
                    order.setOrderNumber(generateOrderNumber("PS","0000000001"));
                    data.put("out_trade_no", order.getOrderNumber());
                    continue;
                }
                if(code_url==null){
                    throw new RuntimeException("下单有问题，出错了");
                }else{
                    order.setOrderState(PayStates.getPayStates("NOTPAY"));
                    order.setCodeUrl(code_url);
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return code_url;
    }

    @Override
    public void closeOrder(Order order) {

    }
    public String generateOrderNumber(String merchantsPrefix,String globalNumber){
        //17位
        String dateStr = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
        //前缀商家加该商家的全局唯一数字
        return merchantsPrefix + dateStr + globalNumber;
    }
}
